package com.kun.companion.core.domain.dto;

/**
 * 舞台尺寸约束配置类
 *
 * <p>用于定义界面舞台（如JavaFX Stage、Swing窗口）的尺寸规则，提供预设尺寸、最小/最大尺寸限制等配置。
 * 适用于需要动态控制窗口尺寸范围或初始化默认尺寸的场景。</p>
 *
 * <p><b>单位说明：</b>所有尺寸值均以像素（px）为单位</p>
 *
 * @author gzc
 * @since 2025/1/27
 **/
public class StageSize {
    /**
     * 预设宽度（默认值：10px）
     * <p>界面初始化时推荐的默认宽度，需满足：minWidth ≤ preWidth ≤ maxWidth</p>
     */
    private double preWidth = 10;

    /**
     * 预设高度（默认值：10px）
     * <p>界面初始化时推荐的默认高度，需满足：minHeight ≤ preHeight ≤ maxHeight</p>
     */
    private double preHeight = 10;

    /**
     * 最小允许宽度（默认值：10px）
     * <p>窗口调整时不可小于此值，需满足：0 < minWidth ≤ preWidth</p>
     */
    private double minWidth = 10;

    /**
     * 最小允许高度（默认值：10px）
     * <p>窗口调整时不可小于此值，需满足：0 < minHeight ≤ preHeight</p>
     */
    private double minHeight = 10;

    /**
     * 最大允许宽度（默认值：10px）
     * <p>窗口调整时不可超过此值，需满足：preWidth ≤ maxWidth</p>
     */
    private double maxWidth = 10;

    /**
     * 最大允许高度（默认值：10px）
     * <p>窗口调整时不可超过此值，需满足：preHeight ≤ maxHeight</p>
     */
    private double maxHeight = 10;


    /**
     * 默认构造函数
     * <p>使用默认尺寸值初始化（所有尺寸均为10px），适用于快速测试场景</p>
     * <p><b>生产环境建议通过全参数构造函数指定合理值</b></p>
     */
    public StageSize() {
    }

    /**
     * 全参数构造函数
     *
     * @param preWidth  预设宽度（需满足 minWidth ≤ preWidth ≤ maxWidth）
     * @param preHeight 预设高度（需满足 minHeight ≤ preHeight ≤ maxHeight）
     * @param minWidth  最小宽度（需满足 0 < minWidth ≤ preWidth）
     * @param minHeight 最小高度（需满足 0 < minHeight ≤ preHeight）
     * @param maxWidth  最大宽度（需满足 preWidth ≤ maxWidth）
     * @param maxHeight 最大高度（需满足 preHeight ≤ maxHeight）
     * @throws IllegalArgumentException 如果参数违反以下任一规则：
     *                                  <ul>
     *                                    <li>尺寸值 ≤ 0</li>
     *                                    <li>min > pre 或 pre > max</li>
     *                                  </ul>
     *
     *                                  <p>示例：
     *                                  <pre>{@code
     *                                  // 创建窗口配置：预设800x600，最小640x480，最大1024x768
     *                                  StageSize sizeConfig = new StageSize(800, 600, 640, 480, 1024, 768);
     *                                  }</pre>
     */
    public StageSize(double preWidth, double preHeight,
                     double minWidth, double minHeight,
                     double maxWidth, double maxHeight) {
        validateDimension("preWidth", preWidth);
        validateDimension("preHeight", preHeight);
        validateMinMax("Width", minWidth, preWidth, maxWidth);
        validateMinMax("Height", minHeight, preHeight, maxHeight);

        this.preWidth = preWidth;
        this.preHeight = preHeight;
        this.minWidth = minWidth;
        this.minHeight = minHeight;
        this.maxWidth = maxWidth;
        this.maxHeight = maxHeight;
    }

    public double getPreWidth() {
        return preWidth;
    }

    /**
     * 设置预设宽度
     *
     * @param preWidth 需满足 0 < minWidth ≤ preWidth ≤ maxWidth
     * @throws IllegalArgumentException 如果参数不满足约束条件
     */
    public void setPreWidth(double preWidth) {
        validateDimension("preWidth", preWidth);
        validateMinMax("preWidth", preWidth, minWidth, maxWidth);
        this.preWidth = preWidth;
    }

    public double getPreHeight() {
        return preHeight;
    }

    /**
     * 设置预设宽度
     *
     * @param preHeight 需满足 0 < minHeight ≤ preHeight ≤ maxHeight
     * @throws IllegalArgumentException 如果参数不满足约束条件
     */
    public void setPreHeight(double preHeight) {
        validateDimension("preHeight", preHeight);
        validateMinMax("preHeight", preHeight, minHeight, maxHeight);
        this.preHeight = preHeight;
    }

    public double getMinWidth() {
        return minWidth;
    }

    public void setMinWidth(double minWidth) {
        this.minWidth = minWidth;
    }

    public double getMinHeight() {
        return minHeight;
    }

    public void setMinHeight(double minHeight) {
        this.minHeight = minHeight;
    }

    public double getMaxWidth() {
        return maxWidth;
    }

    public void setMaxWidth(double maxWidth) {
        this.maxWidth = maxWidth;
    }

    public double getMaxHeight() {
        return maxHeight;
    }

    public void setMaxHeight(double maxHeight) {
        this.maxHeight = maxHeight;
    }

    /**
     * 验证尺寸值是否合法（>0）
     *
     * @param field 字段名（用于异常信息）
     * @param value 待验证的值
     * @throws IllegalArgumentException 如果值 ≤ 0
     */
    private void validateDimension(String field, double value) {
        if (value <= 0) {
            throw new IllegalArgumentException(field + "必须大于0（当前值：" + value + "）");
        }
    }

    /**
     * 验证尺寸范围约束
     *
     * @param dimension 维度名称（Width/Height）
     * @param min       最小值
     * @param pre       预设值
     * @param max       最大值
     * @throws IllegalArgumentException 如果 min > pre 或 pre > max
     */
    private void validateMinMax(String dimension, double min, double pre, double max) {
        if (min > pre || pre > max) {
            throw new IllegalArgumentException(
                    String.format("尺寸约束不合法: min%s(%.1f) ≤ pre%s(%.1f) ≤ max%s(%.1f)",
                            dimension, min, dimension, pre, dimension, max)
            );
        }
    }
}